давай поясню, что в ней получилось, а что нет. Во-первых, там три триггера для способности, в Иниц. сражения указано, чтобы гном периодически кидал в героя молот для проверки работы защиты от магии. В trigger 000 указано, чтобы триггер защиты от магии активировался после изучения Змеиной ловкости, тут много нюансов. Например, я просто не знаю, что ты хотел, сделать промахи от магии для всех, включая бандитов, либо лишь для одного героя на карте. Также изначально герой может обладать Змеиной ловкостью, в таком случае этот триггер не нужен, его можно убрать и изначально включить trigger 001. Может быть так, что на карте у нескольких героев есть Змеиная ловкость, тогда надо задавать им переменные в этом триггере. Короче, тут очень много всего, мог бы сделать универсальную систему для всех случаев, но она была бы очень большой, мне просто жалко своего времени на это, для себя сделал то, что требовалось, мне достаточно. Опиши свою ситуацию, куда тебе нужна Змеиная ловкость, действующая и на заклинания, тогда могут быть советы по trigger 000. Во-вторых, в trigger 001 указано случайное срабатывание защиты от магии, примерно как я описывал выше, только немного иначе выглядят:
так как у меня подразумевается, что на карте только один юнит обладает Змеиной ловкостью от заклинаний, то я его и указываю, иначе может понадобиться использовать переменные для юнитов. В действиях идёт проверка на уровень Змеиной ловкости и выставлении шанса на срабатывание промаха заклинания. Если шанс выпал, то герою добавляется Защита от магии от Амулета защиты, но только моя версия этой способности, чтобы не было потом конфликтов с этим предметом у Верховного мага. При этом trigger 001 отключается, чтобы не сработал повторно до того, как в героя способность прилетит, а то вдруг кто-то ещё направит в героя заклинание, вторая Защита от магии ему добавится что ли? Вместе с отключением trigger 001 включается trigger 002, тут отлавливается срабатывание моей Защиты от магии и добавляется всплывающий текст "промах". Как бы понятно, что раз Защита от магии сработала, значит заклинание попало, там воспроизводится соответствующий игровой звук, триггер отключается, защита от магии убирается и опять запускается trigger 001, чтобы ловить дальше заклинания и считать шанс на промах, ну а потом всплывающий текст. В этом случае, если кто-то издалека направил на героя заклинание, и оно получило шанс на промах, trigger 001 отключился, а кто-то рядом тоже направил заклинание, и оно долетело первым, то первое заклинание промахнётся, trigger 001 включится и будет считать шансы на промах заклинаний, но, направленное издалека заклинание в теории долетит и не промахнётся, так как Защиты от магии уже не будет, а шанс на промах для него уже успешно выпал. Если враги не бьют способностями постоянно, то это не критично, но если монстры нападают массово и атакуют способностями с кулдауном 0,1 секунда, то это будет ощутимо. А вот со всплывающим текстом у меня не очень получилось, промах обычный всплывает над тем, кто промахнулся, но как сделать промах от заклинателя, если произошла описанная выше ситуация, когда для одного заклинания срабатывает шанс на промах, а им пользуется другое более быстрое заклинание? Я не знаю. Недавно тут задавался подобный вопрос, я его не посмотрел, правда, но думаю, что там используются не те триггеры, которыми владею. Как вариант можно делать текст не "промах", а "промах магии" над героем со Змеиной ловкостью.
что-то не вижу на скрине как вы пытаетесь запихнуть в if/then/else. Почему должен угадывать
Предположение: ошибка - локальные переменные объявляются всегда первыми. Если там будет какое-то другое действие, а объявление локалок ниже, то это ошибка. Ты вперед, наверное, поставил действие "if/then/else", а потом начал объявлять что-то там,
правильно
local unit u
if (условие) then
действие
endif
не правильно
if (условие) then
local unit u
endif
Локалки вначале функции всегда объявляются. Можете в код конвентировать и посмотреть.
Вообще - работает наивысший показатель, ничего не суммируется и не складывается.
То что ты читал про формулу - скорее всего описывается метод сложения как в доте
Каждый следующий уменьшает шанс попадания на свой % от оставшегося если у тебя есть 40% уворота, то шанс попадения по тебе 60% если у тебя ещё есть 50% уворота, то шанс попадения на 50% (это 30%, а уворот 70%)
В доте организация была через абилку в ~20 уровней с шагом по 5% уровень 1 - шанс 5%, уровень 2 - шанс 10% ... уровень 10 - шанс 50% ...
И значение округлялось в меньшую сторону (если высчитывается у тебя 62,5%, то будет 60%)
. . .
Ещё как вариант - отлавливать физ.атаки и делать промахи триггерно
У меня был практически рабочий вариант без косяков... но не срослось А так вообще кто-то делал через мгновенные атаки дальнего боя с гашением об каменный доспех и нанесением урона по формулам от всех бонусов (через БД), ну тут сам понимаешь...
ну все по стандарту - проверка на вирусы, проверка реестра, чистка реестра, дефрагментация диска, проверка диска, установка в другую директорию, откат на точку восстановления
Я сравнил стандартный и свой звук. Обнаружил, что у меня 2 канала, у стандартного 1. Я перковертировал все свои звуки... Стало лучше, но часть звуков все равно не работает(
Для каждого дерева нужны три модели: обычная, неактивная (с названием Doodads\Terrain\AshenTree\AshenTree0S.mdx, например) и неактивная разрушенная (Doodads\Terrain\AshenTree\AshenTree0D.mdx). У неактивных моделей должна быть только одна анимация — Stand. У первой — только деревце, у второй — только пенёк, соответственно.
Когда с деревом никто не взаимодействует, отображаются неактивные модели. Ты их не заменил, потому такая вот фигня.
Как сделать полноценно работающие деревья с моделями, не заменяющими стандартные, я не знаю. Возможно, никак.
Настраиваешь в РО дерево так чтобы у него была 1 вариация и там текстуру нужно к дереву прописать если она импортирована внимательно изучи все строки связанные с деревом как разрушенный объект.
У меня кончились мыслИ. Привязку к точкам всё что могу тут предложить, а жаль...
ХОТЯ знаешь чё - осенило меня тут - создавай на позиции здания дамик с картой пути в виде буквы О. То есть само здание как бы без текстуры пути, а его огораживает дами с кольцевой текстурой. Таким образом здание никуда не убежит, зато сможет поворачиваться!
Прикрепляю пример. Только себе текстурку поплотнее сделай
Ну чтобы перевести, из градусов в радианы
180° = pi радиан = 3,14...
Если знаешь расположение градусов в окружности (там 2pi = 360°, или pi/2 = 90°)
60° = pi/3 радиан = 3,14/3 = 1,0466
30° = pi/6 радиан = 3,14/6 = 0,5233
Или использовать готовую формулу Angle to Radians => Angle *pi / 180 (формула)
pi/180 = 3,14/180 = 0,01744 (коэффициент, записан в варе в переменную-множитель bj_DEGTORAD)
_________________
Чтобы перевести из радиан в градусы
Использую формулу Radians to Angle => Radians * 180 / pi
1 радиан = 57,32°
0,5 радиан = 0,5 * 180/3,14 = 28,6°
Используют точно также переменную-множитель bj_RADTODEG, но с другим названием. Там было Deg to Rad (перевести в радианы), здесь Rad to Deg (в градусы) тут есть погрешности до десятичных, до сотых и более. Поэтому может не соответствовать. Это как пример. Считал сам. А вообще юзайте готовые переменные и не морочьте голову
код
local unit u = GetTriggerUnit()
local real a = GetUnitFacing(u) * bj_DEGTORAD //GetUitFacing возвращает параметры в градусы, поэтому нужно перевести в радианы
local real x = GetUnitX(u) + 100. * Cos(a)
local real y = GetUnitY(u) + 100. * Sin(a)
//потом то-то делаешь. x, y
xgm.guru/p/wc3/179127тут есть пример карта, на гуи там, но переделать можно и на jass (там кастер двигается в ту сторону, куда смотрит). И пример в качестве кода, если нужно двигать относительно двух точек (сделал пример движение снаряда от Кастера к цели)
фиксировать угол при применении и постоянно выравнивать юнита при периодической проверке
если ставить скорость поворота 0 - у юнита начнутся проблемы с движением
Патиссончик, про центр области не заметил
точка каждый раз создаётся заново и это утечка Патиссончик, есть прога на сайте для записи логов
так же есть дебаг через прелоад на сайте
вот счётчик утечек
Smart096, баг только в этой карте?
в новых картах бага нету?
если да то стоит проверить импортируемые модели и текстуры (мб часть битая)
но с вероятностью в 60% проблема в системе ибо было много жалоб на баги в вин10
Hodorishe, ну во-первых, сделаем сохранение, прежде, чем менять. Во-вторых, выбираем ландшафт ТЦ, ставим галочку на нестандартности, удаляем всё, кроме того, что не удаляется (склоны), копируем из глуши все копируемые тайлы, расставляя их в том же порядке, что и были. Проверяем. У меня изменились только склоны.
Ну разве что с бездной проблемка возникла, ибо она и как склон, и как тайл.
Если еще немного покопатса на сайте в разделе декораций - можно нагрести кучу добра!
И вобще мой вам совет - научитесь минимальному моделингу: сможете клепать такие вещи за 3 минуты на коленке с необходимым вам видом, формой и текстурой.
Sucsonius, через скилы реализовать покупку/продажу юнитов(все действия описывать триггерно, а инфу показывать в мультибоарде)
ещё можно отдать дамми герою приказ на покупку и таким образом уменьшать
можно создать кучу зданий с разным количеством двенадцатого юнита и при необходимости сменить количество удалять здание и создавать новое возвращая выделение и количество юнитов с 1 по 11
можно сделать полноэкранную таверну с помощью дгуи
имхо последнее лучше всего будет Sucsonius:
который обходит данную проблему
костыли не обходят проблему
они извращают всё таким образом что проблема не заметна на фоне этих костылей
если тебе надо обойти проблему то пиши новый вар3
Sucsonius, через скилы реализовать покупку/продажу юнитов(все действия описывать триггерно, а инфу показывать в мультибоарде)
ещё можно отдать дамми герою приказ на покупку и таким образом уменьшать
можно создать кучу зданий с разным количеством двенадцатого юнита и при необходимости сменить количество удалять здание и создавать новое возвращая выделение и количество юнитов с 1 по 11
можно сделать полноэкранную таверну с помощью дгуи
имхо последнее лучше всего будет Sucsonius:
который обходит данную проблему
костыли не обходят проблему
они извращают всё таким образом что проблема не заметна на фоне этих костылей
если тебе надо обойти проблему то пиши новый вар3
void - это nothing то есть ничего не возвращает функция, а саму функции называют doTheThing, а unit u - аргументы функции, мануалы про cjass почитай (хотя я тоже соглашусь, что написано очень плохо в мануалах. Нужно попробовать немного самим пописать коды)
можно представить как (если хорошо понимаешь jass)
function doTheThing takes unit u returns nothing
... //что-то делаешь с юнитом u (берем аргумент функции - unit u)
endfunction
GetMyUnit - такой не существует, видимо Док имеет в виду подставить свою переменную
пример
например составил пример функции - определить уровень абилы юнита. Функция называется LV, u - юнит, id - целое число, равкод абилы. Возвращает целое число (уровень абилы).
function LV takes unit u, integer id returns integer
return GetUnitAbilityLevel(u, id)
endfunction
'A000' - равкод абилы
local integer lv = LV(GetTriggerUnit(), 'A000') //узнаем уровень героя
Урон настраивается через уровень способности, или как было сказано unit - damage target
команда для использования нестандартной способности берется от той способности, на основе которой ты её сделал, и если это цепь тралла - Unit - issue order with targetign a unit - orc - chain lighting
И в правду рак мозга...
Статьи почитать не судьба? Некоторые предметные способности не повышают уровень - точнее эффект от повышения уровня не изменяется, посему делают 5 (100500) способностей с разными бонусами и выдаются юниту в нужный момент.
Способность маски соби - повышает базовый реген маны и бонус от интеллекта, так что крипам с 0 манарегена эта способность ничего не добавит.
Собственные попытки в студию, что не получается?
Напомним - ЭТО НЕ СТОЛ ЗАКАЗОВ, здесь задают вопросы про реализацию тех или иных вопросов, спрашивают про ошибки, оптмизацию, отдельные функции. Я не увидел в вашем вопросе ничего кроме невнятного описания механики способности, " вокргу кого то там огненные столбы возникают, и еще порча"...
тебе нужен не уровень героя, а уровень способности
здоровье нужно устанавливать на текущее здоровье триггеринг юнит + нужное число + уровень способности твоей абилы умножить на нужное число (там сам смотри, сколько она дамажит)
убери вейт, нормальный таймер ты все равно сейчас не раскуришь, пусть хилит мгновенно после каста, чуть некрасиво, зато относительно нормальный код получится
//////////
в идеале вообще любой такой отхил элементарно делается на вешание событий получения урона кому надо и при них и отхил наносящего, там как раз и отхилится именно на сколько нанёс, а не как у тебя, но это ты имхо опять же еще не раскуришь
Уже решил.для тех кто будет искать данный вопрос - можно использовать свиток регенерации(Раса:люди),он игнорирует сколько у вас хп и имеет длительность.
Создаешь триггер, в событие ставишь период и в действия - изменение переменной. Хз в чём тут может быть трабл. Событие - "время - periodic", Действие - "set variable". Или как-то так. Первое найти легко, там список всего ничего, а второе так и вовсе четвертая строчка (если не ошибаюсь).
Совсем забыл - xgm.guru/p/wc3/articles
Хеш-таблица в которую ты будешь запоминать всех кто сел на корабль или группа. Короче, любое место в котором можно хранить несколько юнитов. При погружении на корабль, запоминаешь юнита. Удаляешь его из игры. Потом в нужный момент моздаешь такого же.Или просто выгружаешь и скрываешь, в нужный момент потом просто передвинуть и показать этого юнита. Вот и все...
Но для начала переведи текстуру в формат jpg\png, далее волшебной палочкой двойным щелчком повыделяй нужный\ нужные тебе сегменты для перекраски. Залей их нужным тебе цветом. Сохрани в png. Экспортируй png => blp.
И всё!
Всё что тебе понадобится: скаченный BLP laboratory, war3ModelEditor
и pixlr.com/editor/?loc=ru?loc=ru
DazzleFirst, возможно ли как то создать локальный триггер при применении способности и уничтожить обратно?
ведь обычно локальные триггеры как правило при применении способности создаются в инициализации карты...
нет нужды выделять еще один триггер (помимо отлова) на заклинание, если оно не слишком громоздкое в плане исполнения.
Как сообщает товарищ nvc123:
Zeuz, лучше не использовать много триггеров
вообще нету такой ситуации в которой надо много триггеров
стоит обратить на это внимание. Везде и всюду есть свои нюансы которые нужно учитывать. Если не выполнить задуманное с помощью одного триггера, то делаем два.
Megacomp, это не джасс а вджасс
проверь включен ли у тебя джассхелпер
так же не забывай что перед тем как нажать "проверка карты" карту нужно сохранить
Ну можно координаты камеры игрока. Но там нужен синк в кеше, чтобы небыло десинха, а это уже ни ГУИ.
Вот примитивный пример получение и сохранения координат камеры игрока:
scope PlayerRelated initializer InitPlayers
globals
force AllPlayers = null
trigger gg_trg_PlayerLeft = null
playerevent bj_enumPlayerEventId = null
player array PL
gamecache data
endglobals
function TriggerRegisterPlayerEventEnum takes nothing returns nothing
call TriggerRegisterPlayerEvent( bj_destInRegionDiesTrig, GetEnumPlayer( ), bj_enumPlayerEventId )
endfunction
function TriggerRegisterForceEvent takes trigger trig, force forforce, playerevent id returns nothing
set bj_destInRegionDiesTrig = trig
set bj_enumPlayerEventId = id
call ForForce( forforce, function TriggerRegisterPlayerEventEnum )
endfunction
function Trig_Player_Left_Actions takes nothing returns nothing
call ForceRemovePlayer( AllPlayers, GetTriggerPlayer( ) )
endfunction
function IsSlotPlayer takes player pl returns boolean
return GetPlayerSlotState( pl ) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController( pl ) == MAP_CONTROL_USER
endfunction
function InitPlayers takes nothing returns nothing
set AllPlayers = CreateForce( )
set gg_trg_PlayerLeft = CreateTrigger( )
set data = InitGameCache( "Data.w3v" )
set bj_forLoopAIndex = 0
loop
exitwhen bj_forLoopAIndex > bj_MAX_PLAYERS
set PL[bj_forLoopAIndex] = Player( bj_forLoopAIndex )
if IsSlotPlayer( PL[bj_forLoopAIndex] ) then
call ForceAddPlayer( AllPlayers, PL[bj_forLoopAIndex] )
call TriggerRegisterPlayerEvent( gg_trg_PlayerLeft, PL[bj_forLoopAIndex] , EVENT_PLAYER_LEAVE )
endif
set bj_forLoopAIndex = bj_forLoopAIndex + 1
endloop
call TriggerAddAction( gg_trg_PlayerLeft, function Trig_Player_Left_Actions )
endfunction
endscope
function Trig_Get_Player_Screen_Cord_Conditions takes nothing returns boolean
return true
endfunction
function Trig_Get_Player_Screen_Cord_Actions takes nothing returns nothing
local player pl = GetTriggerPlayer( )
local real dx = 0.00
local real dy = 0.00
if GetLocalPlayer( ) == pl then
set dx = GetCameraEyePositionX( )
set dy = GetCameraEyePositionY( )
else
set dx = 0.00
set dy = 0.00
endif
call StoreReal( data, "Cord", "X", dx )
call StoreReal( data, "Cord", "Y", dy )
call TriggerSyncStart( )
if GetLocalPlayer( ) == pl then
call SyncStoredReal( data, "Cord", "X" )
call SyncStoredReal( data, "Cord", "Y" )
endif
call TriggerSleepAction( 2.00 )
call TriggerSyncReady( )
set dx = GetStoredReal( data, "Cord", "X" )
set dy = GetStoredReal( data, "Cord", "Y" )
// далее делаем с коорданатами камеры что хочется!
call PingMinimapEx( dx, dy, 3.00, 255, 255, 255, true )
endfunction
//===========================================================================
function InitTrig_Get_Player_Screen_Cord takes nothing returns nothing
set gg_trg_Get_Player_Screen_Cord = CreateTrigger( )
set bj_forLoopAIndex = 0
loop
exitwhen bj_forLoopAIndex > bj_MAX_PLAYERS
if IsPlayerInForce( PL[bj_forLoopAIndex], AllPlayers ) then
call TriggerRegisterPlayerChatEvent( gg_trg_Get_Player_Screen_Cord, PL[bj_forLoopAIndex], "-GetCord", true )
endif
set bj_forLoopAIndex = bj_forLoopAIndex + 1
endloop
call TriggerAddCondition( gg_trg_Get_Player_Screen_Cord, Condition( function Trig_Get_Player_Screen_Cord_Conditions ) )
call TriggerAddAction( gg_trg_Get_Player_Screen_Cord, function Trig_Get_Player_Screen_Cord_Actions )
endfunction
ScopteRectuS, Переменные инициализируются при инициализации карты, она же вроде как глобальная udg_HeroGFL_owner. Или в коде карты насильно инициализировать?
Они же не локалки ScopteRectuS, м, реально null возвращает боевая единицы. Смешно. Окей: И как ему определить созданную во время игры боевую единицу?
Это из-за физического размера выбираемых воинов.
Если хотите сделать способность, которая будет работать также, как и стандартные, то при выборе воинов в качестве радиуса указываете нужный радиус + максимально возможный физический размер воинов на карте.
// Если перебор воинов идёт через цикл:
call GroupEnumUnitsInRange( group, x, y, SPELL_RADIUS + MAX_COLLIZION_SIZE, boolexpr )
loop
// ...
set enumUnit = FirstOfGroup( group )
// ...
if IsUnitEnemy( enumUnit, player ) and IsUnitInRangeXY( enumUnit, x, y, SPELL_RADIUS ) then
call DoSomething( )
endif
// ...
endloop
Как показано выше, с помощью функции IsUnitInRange( ) мы можем отсеять воинов, которые не попали в радиус действия способности, но были выбраны в группу из-за того, что мы указали в функции GroupEnumUnitsInRange( ) радиус чуть больше нужного нам.
да, сейчас вообще обратил внимание что текстуры идущие в комплекте не воспринимаются почему-то, а именно "Shield.blp".
Все равно проблема не решилась, вроде бы смог заменить текстуру, которую не видел но варик не воспринимает модель.
1
» WarCraft 3 / Ловкость
» WarCraft 3 / Своя подсветка функций
» WarCraft 3 / Как настроить шрифт в Jass?
» WarCraft 3 / World Editor
» WarCraft 3 / Позиционный звук
» WarCraft 3 / Импорт Модели Дерева
» WarCraft 3 / Поворот Юнита
» WarCraft 3 / Краши и вылеты из-за триггера.
» WarCraft 3 / Триггер союза
» WarCraft 3 / Тип склона
» WarCraft 3 / Помогите найти ворота
» WarCraft 3 / Продажа юнита
» WarCraft 3 / Равкод 'A00\'
» WarCraft 3 / Продажа юнита
» WarCraft 3 / Условие технология
» WarCraft 3 / вопрос по удалению спецэффектов
» WarCraft 3 / Способность через триггер
» WarCraft 3 / Способность с целью - иллюзия
» WarCraft 3 / Как сделать стандартного воина героем?
» WarCraft 3 / Погрузить на корабль
» WarCraft 3 / Вопрос по моделированию
» WarCraft 3 / вопрос по моделированию
» WarCraft 3 / Глобальная карта
» WarCraft 3 / Область с воздействием на юнита
» WarCraft 3 / Что не так с моделями?